package com.gradumate.client.service;

import java.util.ArrayList;
import java.util.TreeMap;

import com.google.gwt.user.client.rpc.AsyncCallback;
import com.gradumate.shared.FormulierInfo;
import com.gradumate.shared.Gebruiker;
import com.gradumate.shared.LoginToken;

/**
 * Klasse voor de asynchrone communicatie tussen client en server.
 * @author IJsbrand
 *
 */
public interface GraduMateServiceAsync  {
	/**
	 * Deze methode stuurt alle informatie die in het webformulier in ingevuld door naar de server kant.<br>
	 * 
	 * @param naam De naam van het bedrijf die je hebt opgegeven.
	 * @param voertaal De voertaal van het bedrijf die je hebt opgegeven.
	 * @param gebouw De naam die je hebt opgegeven van het gebouw van het bedrijf.
	 * @param straatnaam De straatnaam die je hebt opgegeven van het bedrijf.
	 * @param huisnr Het huisnummer dat je hebt opgegeven van het bedrijf.
	 * @param postcode De postcode die je hebt opgegeven van het bedrijf.
	 * @param plaats De plaats die je hebt opgegeven van het bedrijf.
	 * @param website De website die je hebt opgegeven van het bedrijf.
	 * @param extra De extra informatie die je hebt opgegeven van het bedrijf.
	 * @param werknemers Het aantal werknemers van het bedrijf wat je hebt opgegeven.
	 * @param file Het afstudeervoorstel die je geupload hebt.
	 * @param radiobutton Het soort praktijkopdracht dat je gaat uitvoeren.
	 * @param startdatum De startdatum van je praktijkopdracht.
	 * @param einddatum De einddatum van je eindopdracht.
	 * @param onderwerp Het onderwerp van je praktijkopdracht.
	 * @param aantalstudenten Het maximaal aantal te plaatsen afstuderende studenten bij het bedrijf.
	 * @param vergoeding De bruto vergoeding van de afstuderende student.
	 * @param callback
	 */
	void voorstelIndienen(String naam, String voertaal, String gebouw, String straatnaam, String huisnr, String postcode, 
			String plaats, String website, String extra, String werknemers, String file, String radiobutton, 
			String startdatum, String einddatum, String onderwerp, String aantalstudenten, String vergoeding, AsyncCallback<Void> callback);
	
	/**
	 * Deze fuctie stuurt het emailadres door naar de server kant en geeft het bijbehorende Gebruiker Object terug aan de client.
	 * @param gebruikerEmail Het emailadres van de ingelogde gebruiker.
	 * @param callback
	 */
	void getGebruikerByEmail(String gebruikerEmail, AsyncCallback<Gebruiker> callback);
	
	/**
	 * Haalt alle gebruikers op van de server kant en stuurt die door naar de client.
	 * @param callback
	 */
	void getGebruikers(AsyncCallback<ArrayList<Gebruiker>> callback);
	
	/**
	 * Deze methode haalt alle Gebruikers objecten op van een bepaald type. <br>
	 * Alle typen gebruikers zijn gedefinieert in de Gebruikers klasse. <br>
	 * 
	 * @param type Het type gebruiker die de gebuiker opgegeven heeft.
	 * @param callback
	 */
	void getGebruikerByType(int type, AsyncCallback<ArrayList<Gebruiker>> callback);
	
	 /**
	  * Deze methode stuurt een gebruiker object naar de server kant om het daar vervolgens persistent op te slaan.
	  * @param g Het gebruiker object die je meegeeft.
	  * @param callback
	  */
	void addGebruiker(Gebruiker g,int type, AsyncCallback<Boolean> callback);
	
	/**
	 * Update een Gebruiker object
	 * @param Gebruiker gebruiker die geupdate gaat worden
	 * @return true wanneer gelukt
	 */
	void updateGebruiker(Gebruiker gebruker, AsyncCallback<Boolean> callback);
	
	/**
	 * Haalt een Gebruiker op a.d.v. zijn studentnummer
	 * @param int studentNummer van de Gebruiker
	 * @return gevonden Gebruiker anders null
	 */
	void getGebruikerByStudentnummer(int studentNummer, AsyncCallback<Gebruiker> callback);
	
	/**
	 * Verleent een Gebruiker toegang tot het systeem a.d.v zijn studentnummer
	 * @param int studentnummer van de Gebruiker
	 * @return true wanneer gelukt, anders false
	 */
	void verleenToegang(int studentNummer, AsyncCallback<Boolean> callback);
	
	/**
	 * Controlleerd of de student de toegang tot het systeem verleend heeft gekregen
	 * @param Gebruiker student die gecontroleerd word
	 * @return true wanneer wel, false wanneer niet
	 */
	void hasToegangVerleent(Gebruiker student, AsyncCallback<Boolean> callback);

	/**
	 * Haalt een overzichtslijst op met de nog in te beoordelen ingediende afstudeervoorstellen
	 * @param ArrayList<Site> met nog te beoordelen ingediende afstudeervoostellen
	 */
	void getAfstudeerVoorstelOverzicht(AsyncCallback<ArrayList<Gebruiker>> callback);
	
	
	/**
	 * Haalt een overzichtslijst op met nog te beoordelen ingediende afstudeerverzoeken.
	 * @return ArrayList<Gebruiker> array met Gebruiker objecten die nog moeten afstuderen.
	 */
	void getAfstudeerVerzoekOverzicht(AsyncCallback<ArrayList<Gebruiker>> callback);
	
	/**
	 * Stuurt de beoordeling van het verzoek terug naar de Alfresco server
	 * @param Gebruiker de student die beoordeeld word
	 * @param Gebruiker de studieadviseur die de beoordeling heeft gedaan
	 * @param boolean beoordeling
	 * @param String motivatie
	 * @param callback
	 */
	void setAfstudeerVerzoekBeoordeling(Gebruiker student, Gebruiker studieAdviseur, boolean beoordeling, String motivatie, AsyncCallback<Boolean> callback);
	
	/**
	 * Stuurt de beoordeling van het voorstel terug naar de Alfresco server
	 * @param Gebruiker de student die beoordeeld word
	 * @param Gebruiker de commissielid die de beoordeling heeft gedaan
	 * @param boolean beoordeling
	 * @param String motivatie
	 * @param callback
	 */
	void setAfstudeerVoorstelBeoordeling(Gebruiker student, Gebruiker commissielid, boolean beoordleing, String motivatie, AsyncCallback<Boolean> callback);
	
	/**
	 * Haalt een LoginToken object op uit de Datastore en stuurt deze terug
	 * @param String met de uitgegeven token
	 * @param String met het email adres van de Gebruiker die de token heeft aangevraagd
	 * @return LoginToken
	 */
	void getLoginTokenByTokenAndEmail(String token, String gebruikerEmail, AsyncCallback<LoginToken> callback);
	
	/**
	 * Verwijderd een LoginToken uit de Datastore
	 * @param LoginToken loginToken de token die verwijderd moet worden
	 * @return
	 */
	void deleteLoginToken(LoginToken loginToken, AsyncCallback<Boolean> callback);
	
	/**
	 * Haalt een hashmap op met daarin de waarde die bij een KPI horen van een bepaald gebruikertype.
	 * @return HashMap<String, Integer> met daarin Index => Waarde.
	 */
	void getKpiWaarde(int gebruikerType, AsyncCallback<TreeMap<String, Integer>> callback);

	/**
	 * Stuurt alle informatie van het ingevulde webformulier naar de server-side om het daar vervolgens Persistent
	 * op te laten slaan.
	 * @param info Het object wat alle informatie van het webformulier bevat.
	 * @return Het object 
	 */
	void setFormulier(FormulierInfo info, AsyncCallback<FormulierInfo> callback);

	/**
	 * Haalt de status op van het afstudeervoorstel van de student.
	 * @param Gebruiker student waar de controle voor word uitgevoerd
	 * @return TreeMap<String, Boolean> met daarin diverse true/false waarden
	 */
	void getStatusAfstudeerVoorstelStudent(Gebruiker student, AsyncCallback<TreeMap<String, Boolean>> callback);

	/**
	 * Methode die het afstudeervoorstel opent van de student in de browser. 
	 * @param student Object van de student
	 * @param asyncCallback Asynchrone communicatie
	 */
	void openDocument(Gebruiker student, AsyncCallback<String> asyncCallback);

	void toonVoortgang(AsyncCallback<String> asyncCallback);
}
